package a17_Reflection.Test.Constructor;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

/**
 * @Author quan
 * @Description TODO
 * @Date 2023/5/4 10:11
 */
public class MyReflect3 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        //获取class字节码文件
        Class cls = Class.forName("a17_Reflection.Test.Constructor.Student3");
        //获取所有的方法对象
        //获取所有的公共的方法:包括父类的方法
//        Method[] methods = cls.getMethods();
//        for (Method method:methods) {
//            System.out.println(method);
//        }
//        System.out.println("-------------------------");
//        //获取所有的方法，包括私有的，不能获取父类的
//        Method[] methods1 = cls.getDeclaredMethods();
//        for (Method method:methods1) {
//            System.out.println(method);
//        }
        //获取eat方法：这里要加方法的形参，目的是方法的重载：
        // 因为在Student中有两个带不同参数的eat方法，为了便于区分
        //获取私有的eat方法
        Method m = cls.getDeclaredMethod("eat",String.class);
        System.out.println(m);
        //获取方法的修饰符
        int modifiers = m.getModifiers();
        System.out.println(modifiers);
        //获取方法的名字
        String name = m.getName();
        System.out.println(name);
        //获取方法的形参
        Parameter[] parameters = m.getParameters();
        for (Parameter parameter:parameters) {
            System.out.println(parameter);
        }
        //获取方法抛出的异常
        Class[] exceptionTypes = m.getExceptionTypes();
        for (Class exception:exceptionTypes) {
            System.out.println(exception);
        }
        //运行方法  invoke
        //参数1：stu 表示方法的调用者
        //参数2：表示在调用方法时传递的实际参数
        m.setAccessible(true);//eat方法是私有方法
        Student3 stu = new Student3();
        String result = (String) m.invoke(stu,"火腿肠");
        System.out.println(result);



    }
}
